package tpcomp2010.estructura;

/**
 * Clase Token, implementa Comparable<?>
 */
public class Token implements Comparable<Token> {

    /**
     * Tipo de token que maneja el objeto actual.
     */
    private TipoToken tipo;

    /**
     * Valor del token que maneja la clase actual
     */
    private String valor;

    /**
     * Class constructor especificando el valor del token
     * @param simbolo valor del Token
     */
    public Token(String simbolo) {
        this.valor = simbolo;
        this.setTipo(simbolo);
    }

    /**
     * @return El tipo de Token que contiene el objeto
     */
    public TipoToken getTipo() {
        return tipo;
    }

    /**
     * @return el valor del Token
     */
    public String getValor() {
        return valor;
    }

    /**
     * @param tipo Tipo del Token
     */
    public void setTipo(TipoToken tipo) {
        this.tipo = tipo;
    }

    /**
     * @param valor valor del Token
     */
    public void setValor(String valor) {
        this.valor = valor;
        this.setTipo(valor);
    }

    /**
     * @param t TOken a comparar con el objeto actual
     */
    public int compareTo(Token t) {
        if (this.getTipo() == t.getTipo()
                && this.getValor().compareTo(t.getValor()) == 0) {
            return 0;
        } else {
            return -1;
        }
    }

    /**
     * @param simbolo simbolo que define el TipoToken del Token.
     * @see TipoToken
     */
    private void setTipo(String simbolo) {

        if (simbolo.isEmpty()) {
            this.tipo = TipoToken.FIN;
        } else {

            switch (simbolo.charAt(0)) {
                case '*':
                    this.tipo = TipoToken.KLEENE;
                    break;
                case '+':
                    this.tipo = TipoToken.PLUS;
                    break;
                case '?':
                    this.tipo = TipoToken.CEROUNO;
                    break;
                case '|':
                    this.tipo = TipoToken.OR;
                    break;
                default:
                    this.tipo = TipoToken.ALFA;
                    this.valor = simbolo;
                    break;
            }
        }
    }
}
